'use strict';

const Controller = require('egg').Controller;
/**
 * @controller apiUserController 用户管理
 */
class UserController extends Controller {
  /**  
   * @summary 注册用户
   * @description 注册用户
   * @router post /api/user/reg 
   * * @request username string *username 用户名
   * * @request password string *password 密码
   * * @request repassword string *repassword 确认密码
   * @response 200 user 返回结果。（ 对应 contract 里面的验证属性，下面会提到 。）
   */
  async reg() {
    // 解构
    let {
      ctx,
      app
    } = this
    // 阐述验证
    ctx.validate({
      username: {
        type: 'string',
        required: true,
        desc: '用户名'
      },
      password: {
        type: 'string',
        required: true,
        desc: '密码'
      },
      repassword: {
        type: 'string',
        required: true,
        desc: '确认密码'
      },
      equals: [
        ['password', 'repassword']
      ]
    })
    // 获取参数
    let {
      username,
      password,
      repassword
    } = ctx.request.body
    // 判断用户是否存在
    if (await app.model.User.findOne({
        where: {
          username
        }
      })) {
      return ctx.throw(400, '用户已存在')
    }
    // 判断用户是否被封禁

    // 创建用户
    let user = await app.model.create({
      username,
      password
    })
    // 返回ok
    if (!user) {
      return ctx.throw(400, '用户创建失败')
    }
    ctx.apiSuccess(user)
  }

  /**  
   * @summary 用户登录
   * @description 用户登录
   * @router post /api/user/login 
   * * @request username string *username 用户名
   * * @request password string *password 密码
   * @response 200 user 返回结果。（ 对应 contract 里面的验证属性，下面会提到 。）
   */
  async login() {
    // 解构
    let {
      ctx,
      app,
      service
    } = this
    // 参数验证
    ctx.validate({
      username: {
        type: 'string',
        required: true,
        desc: '用户名'
      },
      password: {
        type: 'string',
        required: true,
        desc: '密码'
      }
    })
    // 获取阐述
    let {
      username,
      password
    } = ctx.request.body
    // 判断用户是否存在
    let user = await app.model.User.findOne({
      where: {
        username
      }
    })
    if (!user) {
      return ctx.throw(400, '用户不存在')
    }
    // 存在--验证密码
    // 验证密码
    await ctx.checkPassword(password, user.password);
    // 生成token
    user = JSON.parse(JSON.stringify(user))
    let token = ctx.getToken(user)
    // 存入redis
    if (!await service.cache.set('user_' + user.id, token)) {
      return ctx.throw(400, '登录失败')
    }
    // 去除用户密码-添加token
    delete user.password
    user.token = token
    // 返回用户信息
    ctx.apiSuccess(user)
  }
   /**  
     * @summary 退出登录
     * @description 退出登录
     * @router post /api/user/logout
     * @response 200 user 返回结果。（ 对应 contract 里面的验证属性，下面会提到 。）
     */
  async logout() {
    // 结构
    let {ctx,service,app}=this
    // 获取用户id
    let current_user_id=ctx.authUser.id
    // 移除redis
    if(!await service.cache.remove('user_'+current_user_id)){
      return ctx.throw(400,'退出登录失败')
    }
    // 返回结果
    ctx.apiSuccess('ok')

  }
 /**  
     * @summary 获取当前用户信息
     * @description 获取当前用户信息
     * @router post /api/user/info
     * @response 200 user 返回结果。（ 对应 contract 里面的验证属性，下面会提到 。）
     */
  async info(){
     // 结构
     let {ctx,app}=this
     // 获取用户id
     let user=ctx.authUser
     ctx.apiSuccess(JSON.parse(JSON.stringify(user)))
  }
}

module.exports = UserController;